<?php

/**
 * Задаёт геттеры и сеттеры для переменных.
 * При обращении к недоступной переменной сначала пытается найти её геттер/сеттер, если не удаётся - пытается обратиться к переменной.
 * Переменные должны именоваться в стиле lowerCamelCase
 *
 * @author a.novikov
 */
abstract class SmartGetters {

	/**
	 * Default getters and setters
	 *
	 * @param string $function
	 * @return mixed
	 */
	public function __call($function, $args)
	{
		$debug = Debug::getInstance()->isDebugMode();

		// determite if it's 'get' or 'set'
		$action = substr($function, 0, 3);
		
		$is_get = ($action === 'get');
		$is_set = ($action === 'set');

		if ( !($is_get || $is_set) ) {
			if ($debug) {
				throw new Exception("Wrong method name.");
			}
			return;
		}
		// replacing 'get' by empty string
		$name = substr_replace($function, '', 0, 3);
		
		$varName = StringFunctions::lcfirst($name);

		// get list of class variables
		$vars = array_keys(get_object_vars($this));

		if (!in_array($varName, $vars)) {
			if ($debug) {
				$class = get_class($this);
				throw new Exception("Variable $varName is not defined in class $class");
			}
		}
		elseif ($is_get) {
			return $this->$varName;
		}
		else {
			$this->$varName = $args[0];
		}

	}

	public function __get($name) {
		return MethodFunctions::callGetter($this, $name);
	}

	public function __set($name, $value){
		return MethodFunctions::callSetter($this, $name, $value);
	}
}
?>
